package com.xwli.javase.example;

import com.xwli.javase.thread.impl.MyCallable;
import com.xwli.javase.thread.impl.MyRunnable;
import com.xwli.javase.thread.impl.MySubThread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @program: springcloud
 * @description: 多线程测试类
 * @author: xwli
 * @create: 2022-03-12 14:48
 **/
public class ThreadExample {

    public static void main(String[] args) throws ExecutionException, InterruptedException{
        testSleep();
        System.out.println("开始执行main线程的任务！！！");
    }

    private static void testRunnableThread(){
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }

    private static void testCallableThread() throws ExecutionException, InterruptedException {
        MyCallable myCallable = new MyCallable();
        FutureTask<Integer> integerFutureTask = new FutureTask<>(myCallable);
        Thread thread = new Thread(integerFutureTask);
        thread.start();
        System.out.println(integerFutureTask.get());
    }

    private static void testSubThread() {
        MySubThread mySubThread = new MySubThread();
        mySubThread.start();
    }

    /**
    * @description:
     *  Daemon
     *  守护线程是程序运行时在后台提供服务的线程，不属于程序中不可或缺的部分。
     *  当所有非守护线程结束时，程序也就终止，同时会杀死所有守护线程。
     *  main() 属于非守护线程。
     *  在线程启动之前使用 setDaemon() 方法可以将一个线程设置为守护线程。
    * @params: []
    * @return: void
    * @author: xwli
    * @date: 2022/3/12 15:23
    */
    private static void testDaemonThread() {
        MySubThread mySubThread = new MySubThread();
        mySubThread.setDaemon(true);
        mySubThread.start();
    }

    /**
    * @description: Thread.sleep(millisec) 方法会休眠当前正在执行的线程，millisec 单位为毫秒
    * @params: []
    * @return: void
    * @author: xwli
    * @date: 2022/3/12 15:39
    */
    private static void testSleep() {
        MySubThread mySubThread = new MySubThread();
        mySubThread.start();
    }

    /**
    * @description: yield()
     * 对静态方法 Thread.yield() 的调用声明了当前线程已经完成了生命周期中最重要的部分，
     * 可以切换给其它线程来执行。该方法只是对线程调度器的一个建议，
     * 而且也只是建议具有相同优先级的其它线程可以运行
    * @params: []
    * @return: void
    * @author: xwli
    * @date: 2022/3/12 15:43
    */
    private static void testYield() {
        MySubThread mySubThread = new MySubThread();
        mySubThread.start();
    }
}
